use ticket locks for spin locks
authorDavid Vrabel <david.vrabel@citrix.com>
Fri, 26 Jun 2015 15:33:34 +0000 (17:33 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 26 Jun 2015 15:33:34 +0000 (17:33 +0200)
commite10784ac424405c82accd0542fcc84cf468c53dc
treebfa200a9636ce2b2541993a6bfe5216189a53f4e
parentbdf741bf4d014eec18f251576c1182ae264397bb
use ticket locks for spin locks

Replace the byte locks with ticket locks.  Ticket locks are: a) fair;
and b) peform better when contented since they spin without an atomic
operation.

The lock is split into two ticket values: head and tail.  A locker
acquires a ticket by (atomically) increasing tail and using the
previous tail value.  A CPU holds the lock if its ticket == head.  The
lock is released by increasing head.

spin_lock_irq() and spin_lock_irqsave() now spin with irqs disabled
(previously, they would spin with irqs enabled if possible).  This is
required to prevent deadlocks when the irq handler tries to take the
same lock with a higher ticket.

Architectures need only provide arch_fetch_and_add() and two barriers:
arch_lock_acquire_barrier() and arch_lock_release_barrier().

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Tim Deegan <tim@xen.org>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/common/spinlock.c
xen/include/asm-arm/system.h
xen/include/asm-x86/system.h
xen/include/xen/spinlock.h